﻿using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using CentroVentas.Clases.Funciones.Venta;

namespace CentroVentas.Funciones.Ventas
{
	public partial class FrmVenta : Form
	{
		// 
		// Dear maintainer:
		// 
		// Once you are done trying to 'optimize' this routine,
		// and have realized what a terrible mistake that was,
		// please increment the following counter as a warning
		// to the next guy:
		// 
		// total_hours_wasted_here = 39
		//
		Venta venta;
		private int _idUsuario;
		int _idProdTemp = 0;
		int _idPrecTemp = 0;
		// No se utiliza.
		// int _cantProd = 0;

		public FrmVenta(int idUsuario)
		{
			_idUsuario = idUsuario;
			InitializeComponent();
			nuevaVenta();
		}

		/// <summary>
		/// FUNCION QUE DIBUJARA LOS ELEMENTOS DEL TABCONTROL EN FORMA HORIZONTAL.
		/// Dont touch it! It's magic!
		/// /* Seriously, people will die if you change this */
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
		{
			Graphics g = e.Graphics;
			Brush _TextBrush;

			// Get the item from the collection.
			TabPage _TabPage = tabControl1.TabPages[e.Index];

			// Get the real bounds for the tab rectangle.
			Rectangle _TabBounds = tabControl1.GetTabRect(e.Index);

			if (e.State == DrawItemState.Selected)
			{
				// Draw a different background color, and don't paint a focus rectangle.
				_TextBrush = new SolidBrush(e.ForeColor);
				g.FillRectangle(Brushes.Gray, e.Bounds);
			}
			else
			{
				_TextBrush = new System.Drawing.SolidBrush(e.ForeColor);
				e.DrawBackground();
			}

			// Use our own font. Because we CAN.
			Font _TabFont = new Font("Arial", 15, FontStyle.Regular, GraphicsUnit.Pixel);

			// Draw string. Center the text.
			StringFormat _StringFlags = new StringFormat();
			_StringFlags.Alignment = StringAlignment.Center;
			_StringFlags.LineAlignment = StringAlignment.Center;
			g.DrawString(_TabPage.Text, _TabFont, _TextBrush, _TabBounds, new StringFormat(_StringFlags));

		}

		private void FrmVenta_Load(object sender, EventArgs e)
		{
			this.WindowState = FormWindowState.Maximized; // No borrar. Solución a mal crecimiento del formulario.

			Clases.Usuarios user = new Clases.Usuarios(_idUsuario);
			txtVendedor.Text = user.NombreUsuario;
		}

		private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
		{
			if (e.TabPageIndex == 1)
			{
				txtProducto.Focus();
			}            
		}

		private void nuevaVenta()
		{
			venta = new Venta();
			venta.Vendedor = _idUsuario;
			venta.FechaHoraInicio = DateTime.Now;
		}

		private void rbtBoleta_CheckedChanged(object sender, EventArgs e)
		{
			venta.TipoDocumento = "BOLETA";
			TipoDocumento.Text = "Boleta";

		}

		private void rbtFactura_CheckedChanged(object sender, EventArgs e)
		{
			venta.TipoDocumento = "FACTURA";
			TipoDocumento.Text = "Factura";
		}

		private void txtProducto_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.F2)
			{
				Funciones.Productos.FunProductosSeleccionar frm = new Productos.FunProductosSeleccionar();
				
				if (frm.ShowDialog() == DialogResult.OK)
				{
					_idProdTemp = frm.IdProducto;
					_idPrecTemp = frm.IdPrecio;
					
					Clases.Funciones.Producto prod = new Clases.Funciones.Producto(_idProdTemp);
					
					txtProducto.Text = prod.CodigoBarras;

					txtDescripcion.Text = "[" +prod.CodigoBarras+"] "+ prod.Descripcion;
					
					txtMarca.Text = prod.NombreMarca;
					// TODO: Retorna un valor numerico, Crear funcion para devolver valor string
					// txtTipoProducto.Text = prod.TipoProducto.ToString();
					// Solucionado temporalmente con:
					txtTipoProducto.Text = "PRODUCTO";
					UMedida.Text = "UNIDAD";
					// -------------------------------
					
					txtComentario.Text = prod.Comentarios;
					txtStock.Text = prod.Stock.ToString();
					txtPrecioVenta.Text = Clases.Currency.formatearMoneda(prod.PrecioVenta);

					txtCantidad.Minimum = 0;
					txtCantidad.Maximum = prod.Stock;

					txtCantidad.Focus();

				}
			}
		}

		private void txtCantidad_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Enter)
			{
				if (!venta.existeProducto(_idProdTemp))
				{
					Clases.Funciones.Producto prod = new Clases.Funciones.Producto(_idProdTemp);
					if (txtCantidad.Value >= Convert.ToInt32(txtStock.Text))
					{
						if (MessageBox.Show(this, "La cantidad seleccionada es mayor ó igual a la existente en bodega.\n ¿Desea continuar?",
							"CentroVentas", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
						{
							try
							{
								venta.agregarProducto(_idProdTemp, Convert.ToInt32(txtCantidad.Value), prod.PrecioVenta,_idPrecTemp);
							}
							catch (Exception)
							{
							}

							DetalleProductos.DataSource = generarDataset();
							DetalleProductos.DataMember = "Productos";
							txtSubTotal.Text = Clases.Currency.formatearMoneda(_subtotal);
							txtDescuento.Text = "$0";
							txtServicioAdicional.Text = "$0";
							txtIVA.Text = Clases.Currency.formatearMoneda(_subtotal * 0.19);
							txtTotal.Text = Clases.Currency.formatearMoneda(_subtotal);
						}
						else
						{
							txtCantidad.Focus();
						}
					}
					else
					{
						try
						{
							if (Convert.ToInt32(txtCantidad.Text) == 0)
							{
								venta.eliminarProducto(_idProdTemp);
							}
							else
							{
								venta.agregarProducto(_idProdTemp, Convert.ToInt32(txtCantidad.Value), prod.PrecioVenta,_idPrecTemp);
							}								
						}
						catch (Exception)
						{
						}

						DetalleProductos.DataSource = generarDataset();
						DetalleProductos.DataMember = "Productos";
						txtSubTotal.Text = Clases.Currency.formatearMoneda(_subtotal);
						txtDescuento.Text = "$0";
						txtServicioAdicional.Text = "$0";
						txtIVA.Text = Clases.Currency.formatearMoneda(_subtotal * 0.19);
						txtTotal.Text = Clases.Currency.formatearMoneda(_subtotal * 1.19);
					}
				}
				else
				{
					Clases.Funciones.Producto prod = new Clases.Funciones.Producto(_idProdTemp);
					if (txtCantidad.Value >= Convert.ToInt32(txtStock.Text))
					{
						if (MessageBox.Show(this, "La cantidad seleccionada es mayor ó igual a la existente en bodega.\n ¿Desea continuar?",
							"CentroVentas", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
						{
							try
							{
								venta.modificarProducto(_idProdTemp, Convert.ToInt32(txtCantidad.Value), prod.PrecioVenta);
							}
							catch (Exception)
							{
							}

							DetalleProductos.DataSource = generarDataset();
							DetalleProductos.DataMember = "Productos";
							txtSubTotal.Text = Clases.Currency.formatearMoneda(_subtotal);
							txtDescuento.Text = "$0";
							txtServicioAdicional.Text = "$0";
							txtIVA.Text = Clases.Currency.formatearMoneda(_subtotal * 0.19);
							txtTotal.Text = Clases.Currency.formatearMoneda(_subtotal);
						}
						else
						{
							txtCantidad.Focus();
						}
					}
					else
					{
						try
						{
							if (Convert.ToInt32(txtCantidad.Text) == 0)
							{
								venta.eliminarProducto(_idProdTemp);
							}
							else
							{
								venta.modificarProducto(_idProdTemp, Convert.ToInt32(txtCantidad.Value), prod.PrecioVenta);
							}								
						}
						catch (Exception)
						{
						
							
						}

						DetalleProductos.DataSource = generarDataset();
						DetalleProductos.DataMember = "Productos";
						txtSubTotal.Text = Clases.Currency.formatearMoneda(_subtotal);
						txtDescuento.Text = "$0";
						txtServicioAdicional.Text = "$0";
						txtIVA.Text = Clases.Currency.formatearMoneda(_subtotal * 0.19);
						txtTotal.Text = Clases.Currency.formatearMoneda(_subtotal * 1.19);
					}
				}
			}
		}

		private double _subtotal = 0;

		private DataSet generarDataset(){
			DataSet ds = new DataSet();
			ds.Tables.Add("Productos");
			ds.Tables["Productos"].Columns.Add("CodBarras").Caption = "Codigo barras";
			ds.Tables["Productos"].Columns.Add("Descripcion").Caption = "Descripcion";
			ds.Tables["Productos"].Columns.Add("Cantidad").Caption = "Cantidad";
			ds.Tables["Productos"].Columns.Add("Subtotal").Caption = "SubTotal";
			_subtotal = 0;
			foreach (DetalleVenta item in venta.GetDetalle)
			{
				Clases.Funciones.Producto prod = new Clases.Funciones.Producto(item.IdProd);

				DataRow dr = ds.Tables["Productos"].NewRow();

				dr[0] = prod.CodigoBarras;
				dr[1] = prod.Descripcion;
				dr[2] = item.Cantidad;
				dr[3] = Clases.Currency.formatearMoneda(item.PrecioUnidad * item.Cantidad);
				_subtotal = _subtotal + (item.PrecioUnidad * item.Cantidad);
				ds.Tables["Productos"].Rows.Add(dr);

			}
			return ds;
		}

		private void btnTerminarVenta_Click(object sender, EventArgs e)
		{
			if (DetalleProductos.RowCount != 0)
			{
                venta.CrearVenta(_idUsuario);
                Clases.Utiles.Utilidades.mensaje(Clases.Utiles.TipoMensaje.OK, "Venta realizada.", 2);
                Clases.Reportes.ImprimirVenta(venta.IdUltimaVenta());

			}
			else
			{
				Clases.Utiles.Utilidades.mensaje(Clases.Utiles.TipoMensaje.ERROR, "No se ingresaron productos o servicios.", 2);
			}
		}





	}
}
